#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <stdlib.h>

#define N 5

int** matrice1;
int** matrice2;
int** matrice3;

void creemat1 ( ) {

	int i,j;

	matrice1=(int**)malloc(N*sizeof(int*));
	for(i=0;i<N;i++)
		matrice1[i]=(int*)malloc(N*sizeof(int));

	for(i=0;i<N;i++) {
		for(j=0;j<N;j++) {
				matrice1[i][j]=(int)((rand()%1)+1);
		}
	}

	pthread_exit(NULL);

}

void creemat2 ( ) {

	int i,j;

	matrice2=(int**)malloc(N*sizeof(int*));
	for(i=0;i<N;i++)
		matrice2[i]=(int*)malloc(N*sizeof(int));

	for(i=0;i<N;i++) {
		for(j=0;j<N;j++) {
				matrice2[i][j]=(int)((rand()%1)+1);
		}
	}

	pthread_exit(NULL);

}

void creemat3 ( ) {

	int i,j;

	matrice3=(int**)malloc(N*sizeof(int*));
	for(i=0;i<N;i++)
		matrice3[i]=(int*)malloc(N*sizeof(int));

	for(i=0;i<N;i++) {
		for(j=0;j<N;j++) {
				matrice3[i][j]=0;
		}
	}

	pthread_exit(NULL);

}

void multij(int tab[]) {

	int somme=0;
	int k,l;

	for(l=0;l<N;l++){
		somme += matrice1[l][tab[1]]*matrice2[tab[0]][l];
	}


	matrice3[tab[0]][tab[1]]=somme;

	printf("I : %d  J : %d  Somme : %d\n",tab[0],tab[1],somme);

	pthread_exit(NULL);

} 



int main (int argc , char** argv ) {

	srand(time(NULL));

	int i,j;
	int tab[2];

	pthread_t id[3];

	pthread_t calc[N][N];

	if( pthread_create(&id[0],NULL,(void*)creemat1,NULL) != 0 ) {
		perror("Erreur Thread Mat 1 : ");
		exit(1);
	}

	if( pthread_create(&id[1],NULL,(void*)creemat2,NULL) != 0 ) {
		perror("Erreur Thread Mat 2 : ");
		exit(2);
	}

	if( pthread_create(&id[2],NULL,(void*)creemat3,NULL) != 0 ) {
		perror("Erreur Thread Mat 3 : ");
		exit(3);
	}

	pthread_join(id[0],NULL);
	pthread_join(id[1],NULL);
	pthread_join(id[2],NULL);

	printf("Matrice 1 : \n");
	for(i=0;i<N;i++) {
		for(j=0;j<N;j++) {
				printf("%d ",matrice1[i][j]);
		}
		printf("\n");
	}

	printf("Matrice 2 : \n");
	for(i=0;i<N;i++) {
		for(j=0;j<N;j++) {
				printf("%d ",matrice2[i][j]);
		}
		printf("\n");
	}

	for(i=0;i<N;i++) {
		for(j=0;j<N;j++) {
					tab[0]=i;
					tab[1]=j;
					printf("MAIN  I : %d  J : %d \n",tab[0],tab[1]);
					if( (pthread_create(&calc[i][j],NULL,(void*)multij,tab)) != 0 ) {
						perror("Erreur Thread Calc : ");
						exit(4);
					}
					//pthread_join(calc[i][j],NULL);
		}
	}

	//sleep(5);

	for(i=0;i<N;i++){
		for(j=0;j<N;j++){
			pthread_join(calc[i][j],NULL);
		}
	}

	printf("Matrice 3 : \n");
	for(i=0;i<N;i++) {
		for(j=0;j<N;j++) {
				printf("%d ",matrice3[i][j]);
		}
		printf("\n");
	}



	return 0;
}





